mruby 4.0.0
mruby is the lightweight implementation of the Ruby language
Loading...
Searching...
No Matches
proc.h File Reference

More...

#include "common.h"
#include <mruby/irep.h>
#include <string.h>
Include dependency graph for proc.h:

Go to the source code of this file.

Classes

struct  REnv
 Proc class. More...
 
struct  RProc
 

Macros

#define MRB_ENV_SET_LEN(e, len)
 
#define MRB_ENV_LEN(e)
 
#define MRB_ENV_CLOSE(e)
 
#define MRB_ENV_ONSTACK_P(e)
 
#define MRB_ENV_BIDX(e)
 
#define MRB_ENV_SET_BIDX(e, idx)
 
#define MRB_ENV_SET_VISIBILITY(e, vis)
 
#define MRB_ENV_VISIBILITY(e)
 
#define MRB_ENV_VISIBILITY_BREAK_P(e)
 
#define MRB_ENV_COPY_FLAGS_FROM_CI(e, ci)
 
#define MRB_ASPEC_REQ(a)
 
#define MRB_ASPEC_OPT(a)
 
#define MRB_ASPEC_REST(a)
 
#define MRB_ASPEC_POST(a)
 
#define MRB_ASPEC_KEY(a)
 
#define MRB_ASPEC_KDICT(a)
 
#define MRB_ASPEC_BLOCK(a)
 
#define MRB_ASPEC_NOBLOCK(a)
 
#define MRB_PROC_CFUNC_FL   128
 
#define MRB_PROC_CFUNC_P(p)
 
#define MRB_PROC_CFUNC(p)
 
#define MRB_PROC_STRICT   256
 
#define MRB_PROC_STRICT_P(p)
 
#define MRB_PROC_ORPHAN   512
 
#define MRB_PROC_ORPHAN_P(p)
 
#define MRB_PROC_ENVSET   1024
 
#define MRB_PROC_ENV_P(p)
 
#define MRB_PROC_ENV(p)
 
#define MRB_PROC_TARGET_CLASS(p)
 
#define MRB_PROC_SET_TARGET_CLASS(p, tc)
 
#define MRB_PROC_SCOPE   2048
 
#define MRB_PROC_SCOPE_P(p)
 
#define MRB_PROC_NOARG   4096 /* for MRB_PROC_CFUNC_FL, aspec == MRB_ARGS_NONE() */
 
#define MRB_PROC_NOARG_P(p)
 
#define MRB_PROC_ALIAS   8192
 
#define MRB_PROC_ALIAS_P(p)
 
#define MRB_PROC_CASPEC_MASK   0xfc07fu /* bits 0-6 and 14-19 */
 
#define mrb_proc_ptr(v)
 
#define mrb_cfunc_env_get(mrb, idx)
 
#define MRB_METHOD_FUNC_FL   (1 << 24)
 
#define MRB_METHOD_PUBLIC_FL   0
 
#define MRB_METHOD_PRIVATE_FL   (1 << 25)
 
#define MRB_METHOD_PROTECTED_FL   (1 << 26)
 
#define MRB_METHOD_VDEFAULT_FL   ((1 << 25) | (1 << 26))
 
#define MRB_METHOD_VISIBILITY_MASK   ((1 << 25) | (1 << 26))
 
#define MRB_METHOD_FUNC_P(m)
 
#define MRB_METHOD_FUNC(m)
 
#define MRB_METHOD_FROM_FUNC(m, fn)
 
#define MRB_METHOD_FROM_PROC(m, pr)
 
#define MRB_METHOD_PROC_P(m)
 
#define MRB_METHOD_PROC(m)
 
#define MRB_METHOD_UNDEF_P(m)
 
#define MRB_METHOD_VISIBILITY(m)
 
#define MRB_SET_VISIBILITY_FLAGS(f, v)
 
#define MRB_METHOD_SET_VISIBILITY(m, v)
 
#define MRB_METHOD_CFUNC_P(m)
 
#define MRB_METHOD_CFUNC(m)
 

Functions

mrb_bool mrb_env_unshare (mrb_state *, struct REnv *, mrb_bool noraise)
 
static uint32_t mrb_proc_compress_aspec (mrb_aspec aspec)
 
static mrb_aspec mrb_proc_decompress_caspec (uint32_t flags)
 
static void mrb_proc_set_cfunc_aspec (struct RProc *p, mrb_aspec aspec)
 
struct RProcmrb_proc_new (mrb_state *, const mrb_irep *)
 
struct RProcmrb_proc_new_cfunc (mrb_state *, mrb_func_t)
 
struct RProcmrb_closure_new_cfunc (mrb_state *mrb, mrb_func_t func, int nlocals)
 
struct RProcmrb_proc_new_cfunc_with_env (mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv)
 
mrb_value mrb_proc_cfunc_env_get (mrb_state *mrb, mrb_int idx)
 
mrb_value mrb_load_proc (mrb_state *mrb, const struct RProc *proc)
 
void mrb_vm_ci_env_clear (mrb_state *mrb, mrb_callinfo *ci)
 It can be used to isolate top-level scopes referenced by blocks generated by mrb_load_string_cxt() or similar called before entering the mruby VM (e.g.
 
void mrb_vm_ci_proc_set (mrb_callinfo *ci, const struct RProc *p)
 
struct RClassmrb_vm_ci_target_class (const mrb_callinfo *ci)
 
void mrb_vm_ci_target_class_set (mrb_callinfo *ci, struct RClass *tc)
 
struct REnvmrb_vm_ci_env (const mrb_callinfo *ci)
 
void mrb_vm_ci_env_set (mrb_callinfo *ci, struct REnv *e)
 

Detailed Description

  • Proc class

See Copyright Notice in mruby.h

Macro Definition Documentation

◆ MRB_ASPEC_BLOCK

#define MRB_ASPEC_BLOCK ( a)
Value:
((a) & 1)

◆ MRB_ASPEC_KDICT

#define MRB_ASPEC_KDICT ( a)
Value:
(((a) >> 1) & 0x1)

◆ MRB_ASPEC_KEY

#define MRB_ASPEC_KEY ( a)
Value:
(((a) >> 2) & 0x1f)

◆ MRB_ASPEC_NOBLOCK

#define MRB_ASPEC_NOBLOCK ( a)
Value:
(((a) >> 23) & 0x1)

◆ MRB_ASPEC_OPT

#define MRB_ASPEC_OPT ( a)
Value:
(((a) >> 13) & 0x1f)

◆ MRB_ASPEC_POST

#define MRB_ASPEC_POST ( a)
Value:
(((a) >> 7) & 0x1f)

◆ MRB_ASPEC_REQ

#define MRB_ASPEC_REQ ( a)
Value:
(((a) >> 18) & 0x1f)

◆ MRB_ASPEC_REST

#define MRB_ASPEC_REST ( a)
Value:
(((a) >> 12) & 0x1)

◆ mrb_cfunc_env_get

#define mrb_cfunc_env_get ( mrb,
idx )
Value:
mrb_proc_cfunc_env_get(mrb, idx)

◆ MRB_ENV_BIDX

#define MRB_ENV_BIDX ( e)
Value:
(((e)->flags >> 8) & 0xff)

◆ MRB_ENV_CLOSE

#define MRB_ENV_CLOSE ( e)
Value:
((e)->cxt = NULL)

◆ MRB_ENV_COPY_FLAGS_FROM_CI

#define MRB_ENV_COPY_FLAGS_FROM_CI ( e,
ci )
Value:
MRB_FLAGS_SET((e)->flags, 16, 3, (ci)->vis)

◆ MRB_ENV_LEN

#define MRB_ENV_LEN ( e)
Value:
((mrb_int)((e)->flags & 0xff))

◆ MRB_ENV_ONSTACK_P

#define MRB_ENV_ONSTACK_P ( e)
Value:
((e)->cxt != NULL)

◆ MRB_ENV_SET_BIDX

#define MRB_ENV_SET_BIDX ( e,
idx )
Value:
((e)->flags = (((e)->flags & ~(0xff<<8))|((unsigned int)(idx) & 0xff)<<8))

◆ MRB_ENV_SET_LEN

#define MRB_ENV_SET_LEN ( e,
len )
Value:
((e)->flags = (((e)->flags & ~0xff)|((unsigned int)(len) & 0xff)))

◆ MRB_ENV_SET_VISIBILITY

#define MRB_ENV_SET_VISIBILITY ( e,
vis )
Value:
MRB_FLAGS_SET((e)->flags, 16, 2, vis)

◆ MRB_ENV_VISIBILITY

#define MRB_ENV_VISIBILITY ( e)
Value:
MRB_FLAGS_GET((e)->flags, 16, 2)

◆ MRB_ENV_VISIBILITY_BREAK_P

#define MRB_ENV_VISIBILITY_BREAK_P ( e)
Value:
MRB_FLAG_CHECK((e)->flags, 18)

◆ MRB_METHOD_CFUNC

#define MRB_METHOD_CFUNC ( m)
Value:
(MRB_METHOD_FUNC_P(m)?MRB_METHOD_FUNC(m):MRB_PROC_CFUNC(MRB_METHOD_PROC(m)))

◆ MRB_METHOD_CFUNC_P

#define MRB_METHOD_CFUNC_P ( m)
Value:
(MRB_METHOD_FUNC_P(m) || (MRB_METHOD_PROC(m)?(MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m))):FALSE))

◆ MRB_METHOD_FROM_FUNC

#define MRB_METHOD_FROM_FUNC ( m,
fn )
Value:
do{(m).flags=MRB_METHOD_FUNC_FL;(m).as.func=(fn);}while(0)

◆ MRB_METHOD_FROM_PROC

#define MRB_METHOD_FROM_PROC ( m,
pr )
Value:
do{(m).flags=0;(m).as.proc=(pr);}while(0)

◆ MRB_METHOD_FUNC

#define MRB_METHOD_FUNC ( m)
Value:
((m).as.func)

◆ MRB_METHOD_FUNC_P

#define MRB_METHOD_FUNC_P ( m)
Value:
((m).flags&MRB_METHOD_FUNC_FL)

◆ MRB_METHOD_PROC

#define MRB_METHOD_PROC ( m)
Value:
((m).as.proc)

◆ MRB_METHOD_PROC_P

#define MRB_METHOD_PROC_P ( m)
Value:
(!MRB_METHOD_FUNC_P(m))

◆ MRB_METHOD_SET_VISIBILITY

#define MRB_METHOD_SET_VISIBILITY ( m,
v )
Value:
MRB_SET_VISIBILITY_FLAGS((m).flags,(v))

◆ MRB_METHOD_UNDEF_P

#define MRB_METHOD_UNDEF_P ( m)
Value:
((m).as.proc==NULL)

◆ MRB_METHOD_VISIBILITY

#define MRB_METHOD_VISIBILITY ( m)
Value:
((m).flags & MRB_METHOD_VISIBILITY_MASK)

◆ MRB_PROC_ALIAS_P

#define MRB_PROC_ALIAS_P ( p)
Value:
(((p)->flags & MRB_PROC_ALIAS) != 0)

◆ MRB_PROC_CFUNC

#define MRB_PROC_CFUNC ( p)
Value:
(p)->body.func

◆ MRB_PROC_CFUNC_P

#define MRB_PROC_CFUNC_P ( p)
Value:
(((p)->flags & MRB_PROC_CFUNC_FL) != 0)

◆ MRB_PROC_ENV

#define MRB_PROC_ENV ( p)
Value:
(MRB_PROC_ENV_P(p) ? (p)->e.env : NULL)

◆ MRB_PROC_ENV_P

#define MRB_PROC_ENV_P ( p)
Value:
(((p)->flags & MRB_PROC_ENVSET) != 0)

◆ MRB_PROC_NOARG_P

#define MRB_PROC_NOARG_P ( p)
Value:
(((p)->flags & MRB_PROC_NOARG) != 0)

◆ MRB_PROC_ORPHAN_P

#define MRB_PROC_ORPHAN_P ( p)
Value:
(((p)->flags & MRB_PROC_ORPHAN) != 0)

◆ mrb_proc_ptr

#define mrb_proc_ptr ( v)
Value:
((struct RProc*)(mrb_ptr(v)))
Definition proc.h:53

◆ MRB_PROC_SCOPE_P

#define MRB_PROC_SCOPE_P ( p)
Value:
(((p)->flags & MRB_PROC_SCOPE) != 0)

◆ MRB_PROC_SET_TARGET_CLASS

#define MRB_PROC_SET_TARGET_CLASS ( p,
tc )
Value:
do {\
if (MRB_PROC_ENV_P(p)) {\
(p)->e.env->c = (tc);\
mrb_field_write_barrier(mrb, (struct RBasic*)(p)->e.env, (struct RBasic*)(tc));\
}\
else {\
(p)->e.target_class = (tc);\
mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)(tc));\
}\
} while (0)
Definition object.h:19

◆ MRB_PROC_STRICT_P

#define MRB_PROC_STRICT_P ( p)
Value:
(((p)->flags & MRB_PROC_STRICT) != 0)

◆ MRB_PROC_TARGET_CLASS

#define MRB_PROC_TARGET_CLASS ( p)
Value:
(MRB_PROC_ENV_P(p) ? (p)->e.env->c : (p)->e.target_class)

◆ MRB_SET_VISIBILITY_FLAGS

#define MRB_SET_VISIBILITY_FLAGS ( f,
v )
Value:
((f)=(((f)&~MRB_METHOD_VISIBILITY_MASK)|(v)))

Function Documentation

◆ mrb_vm_ci_env_clear()

void mrb_vm_ci_env_clear ( mrb_state * mrb,
mrb_callinfo * ci )
extern

It can be used to isolate top-level scopes referenced by blocks generated by mrb_load_string_cxt() or similar called before entering the mruby VM (e.g.

from main()). In that case, the ci parameter should be mrb->c->cibase.

#include <mruby.h>
#include <mruby/compile.h>
#include <mruby/proc.h>

int
main(int argc, char **argv)
{
  mrb_state *mrb;
  mrb_ccontext *cxt;
  mrb_value blk, ret;

  mrb = mrb_open();
  cxt = mrb_ccontext_new(mrb);
  blk = mrb_load_string_cxt(mrb, "x, y, z = 1, 2, 3; proc { [x, y, z] }", cxt);
  mrb_vm_ci_env_clear(mrb, mrb->c->cibase);
  mrb_load_string_cxt(mrb, "x, y, z = 4, 5, 6", cxt);
  ret = mrb_funcall(mrb, blk, "call", 0);
  mrb_p(mrb, ret);  // => [1, 2, 3]
                    // => [4, 5, 6] if `mrb_vm_ci_env_clear()` is commented out
  mrb_ccontext_free(mrb, cxt);
  mrb_close(mrb);

  return 0;
}

The top-level local variable names stored in mrb_ccontext are retained. Use also mrb_ccontext_cleanup_local_variables() at the same time, if necessary.